import axios, { AxiosRequestConfig, Canceler } from 'axios';
import axiosRetry from 'axios-retry';
import { reactive } from 'vue';
import qs from 'qs';
import NProgress from './ngrogress';
import { ElNotification } from 'element-plus';

const $messageError = function (message = "", options = {}) {
  return ElNotification({
    title: "提示",
    type: "error",
    message,
    showClose: false,
    ...options,
  })
}

const pendingMap = new Map<string, Canceler>();

/**
 * 储存发送的每个请求，用于主动取消 请求
 */
class ReqCanceler {
  /**
   * 添加请求
   */
  add() {
    pendingMap.set('1', function () { })
  }

  /**
   * 移除
   */
  remove() { }

  /**
   * 移除所有
   */
  removeAll() { }

  /**
   * 重置
   */
  reset() { }
}

const reqCanceler = new ReqCanceler();

const instance = axios.create();

axiosRetry(instance, { retries: 3 }); // 接口失败，重试。次数：3次。

const AUTH_TOKEN = "example_auth_token";

instance.defaults.baseURL = "/";
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
instance.defaults.timeout = 2500; // 现在，在超时前，所有请求都会等待 2.5 秒

// 请求拦截器
instance.interceptors.request.use(function (config) {
  NProgress.start();

  return config;
}, function (error) {
  $messageError("请求失败, 请稍后再试！");
  NProgress.done();
  return Promise.reject(error);
});

// 响应拦截器
instance.interceptors.response.use(function (response) {
  if (response) {
    $messageError()
  }
  NProgress.done();
  return response;
}, function (error) {
  const { response: { status: statusCode } } = error;
  if (statusCode === 404) {
    $messageError('接口已被关闭!');
  } else {
    $messageError('请求超时或服务器出错!');
  }
  $messageError(error)
  NProgress.done();
  return Promise.reject(error);
});
